//
//  CXSaveFileToPhone.m
//  aaa
//
//  Created by 季文斌 on 2024/1/5.
//  Copyright © 2024 Alibaba. All rights reserved.
//
//文件保存
#import "CXSaveFileToPhone.h"

@interface CXSaveFileToPhone ()<UIDocumentInteractionControllerDelegate,UIDocumentPickerDelegate>

///控制器
@property (nonatomic, strong) UIViewController *controller;

@end

@implementation CXSaveFileToPhone

///单例初始化
+ (instancetype)sharedManager {
    static CXSaveFileToPhone * manager;//
    static dispatch_once_t onceToken;
    dispatch_once(&onceToken, ^{
        manager = [[CXSaveFileToPhone alloc] init];
    });
    return manager;
}

- (instancetype)init
{
    self = [super init];
    if (self) {
        
    }
    return self;
}


/// 保存文件到手机系统文件app
/// - Parameters:
///   - base64DataSrting: base64文件
///   - headStr: base64文件携带的前缀，有些要去掉
///   - controller: 控制器
- (void)saveFileToPhoneWithBase64DataSrting:(NSString *)base64DataSrting withHeadStr:(NSString*)headStr AndController:(UIViewController *)controller{
    if (base64DataSrting.length<=0) {
        return;
    }
    if (headStr.length<=0) {
        headStr = @"";
    }
    //必须去掉特殊符号，否则无法保存
    //去掉头部的前缀：这个是zip你那边根据实际替换下。headStr例如：data:application/zip;base64,
    base64DataSrting =  [base64DataSrting stringByReplacingOccurrencesOfString:headStr withString:@""];
    // str = [str substringFromIndex:23];   //23 是根据前缀的具体字符长度而定的。
    //进行首尾空字符串的处理
    base64DataSrting = [base64DataSrting stringByTrimmingCharactersInSet:[NSCharacterSet whitespaceAndNewlineCharacterSet]]; //去除掉首尾的空白字符和换行字符
    //进行空字符串的处理
    base64DataSrting = [base64DataSrting stringByReplacingOccurrencesOfString:@"\r" withString:@""];
    //进行换行字符串的处理
    base64DataSrting = [base64DataSrting stringByReplacingOccurrencesOfString:@"\n" withString:@""];
     
    
    //存入本地
    NSString *fileName = [NSString getNowDateFormat:@"yyyy-MM-dd-HH-mm-ss"];//文件名字，用当前时间，不能有空格，防止重复
    //要储存的文件路径
    NSString *fullPath = [[NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES)lastObject] stringByAppendingPathComponent:fileName];//stringByAppendingPathComponent是添加/号，使之变成一个完整的路径
    NSLog(@"文件全路径：%@",fullPath);
    /// base文件转Data
    NSData *decodData = [[NSData alloc] initWithBase64EncodedString:base64DataSrting options:NSDataBase64DecodingIgnoreUnknownCharacters];
    //文件写入沙盒
    BOOL downResult = [decodData writeToFile:fullPath atomically:YES];
    if (downResult) {
        //保存到文件App
        [self saveFileToPhoneWithUrl:fullPath AndController:controller];
    }else{
        //文件名有误,存储失败
    }
}


/// 保存文件到手机文件指定目录《文件APP》
/// - Parameters:
///   - filePathURL: 是AFN下载完成返回的文件路径，例如：/private/var/containers/Bundle/Application/97F74F8B-C481-4894-92F1-B9284BF98E2C/aaa.app/private_hnnx.pdf
///   - controller: 所在控制器
- (void)saveFileToPhoneWithUrl:(NSString *)filePathURL AndController:(UIViewController *)controller{
    self.controller = controller;
    //filePath是AFN下载完成返回的文件路径
    if (filePathURL.length<=0) {
        return;
    }
    //保存
    UIDocumentPickerViewController *documentPicker = [[UIDocumentPickerViewController alloc] initWithURL:[NSURL URLWithString:[NSString stringWithFormat:@"file://%@",filePathURL]] inMode:UIDocumentPickerModeExportToService];//UIDocumentPickerModeExportToService文件选择器拷贝文件到一个外部路径，不会修改源文件。
    documentPicker.delegate = self;//设置代理
    documentPicker.modalPresentationStyle = UIModalPresentationFormSheet;//模态模式
    [self.controller presentViewController:documentPicker animated:YES completion:nil];
}

#pragma mark - UIDocumentInteractionControllerDelegate
//回调View
-(UIView*)documentInteractionControllerViewForPreview:(UIDocumentInteractionController*)controller {
    return self.controller.view;
}

//视图
-(CGRect)documentInteractionControllerRectForPreview:(UIDocumentInteractionController*)controller {
    return self.controller.view.frame;
}

#pragma mark - UIDocumentPickerDelegate

- (void)documentPicker:(UIDocumentPickerViewController *)controller didPickDocumentsAtURLs:(NSArray <NSURL *>*)urls {
     //保存成功
    [DWBToast showCenterWithText:@"保存成功"];
}

- (void)documentPickerWasCancelled:(UIDocumentPickerViewController *)controller{
     //取消保存
    NSLog(@"文件保存取消");
}

/*
UIDocumentPickerViewController有四种模式：

 UIDocumentPickerModeImport：用户选择一个外部文件，文件选择器拷贝该文件到应用沙盒，不会修改源文件。
 UIDocumentPickerModeOpen：打开一个外部文件，用户可以修改该文件。
 UIDocumentPickerModeExportToService：文件选择器拷贝文件到一个外部路径，不会修改源文件。
 UIDocumentPickerModeMoveToService：拷贝文件到外部路径，同时可以修改该拷贝。
 
 */


#pragma mark-------调用系统文件预览功能 S-------------

/*
 iOS 使用使用UIDocumentInteractionController预览文件(支持PDF、word、Excel、图片等)
 UIDocumentInteractionController是 OC 语言的一个类，但是他并不是一个 controller，而是一个继承自 NSObject 类。
 作用
 （1）预览类似 pdf、doc、ppt等类型文件的类。
 （2）可以将用户接收到的文件分享到用户手机上的其他 App 中。
 
 UIDocumentInteractionController主要由两个功能，一个是文件预览，另一个就是调用iPhone里第三方相关的app打开文档（注意这里不是根据url scheme 进行识别，而是苹果的自动识别）
 */


/// 用手机预览文件
/// - Parameters:
///   - filePathURL: 是AFN下载完成返回的文件路径，例如：/private/var/containers/Bundle/Application/97F74F8B-C481-4894-92F1-B9284BF98E2C/aaa.app/private_hnnx.pdf
///   - controller: 所在控制器
- (void)previewWithUrl:(NSString *)filePathURL AndController:(UIViewController *)controller{
    
    self.controller = controller;
    //初始化文档交互
    
    if (filePathURL.length<=0) {
        return;
    }
    
    NSURL *url = [NSURL URLWithString:[NSString stringWithFormat:@"file://%@",filePathURL]];
    //预览
    UIDocumentInteractionController *documentController = [UIDocumentInteractionController interactionControllerWithURL:url];
    [documentController setDelegate:self];//代理：UIDocumentInteractionControllerDelegate
    
    //用户预览文件：当前APP打开  需实现协议方法才可以完成预览功能：documentInteractionControllerViewControllerForPreview
    BOOL canOpen =[documentController presentPreviewAnimated:YES];
    if (!canOpen) {
        NSLog(@"预览失败");
        DWBAlertShow(@"文件预览失败");
    }
}

//文件预览的代码：指定UIDocumentInteractionController要显示的视图所在的父视图容器
- (UIViewController *)documentInteractionControllerViewControllerForPreview:(UIDocumentInteractionController *)controller {
    //注意：此处要求的控制器，必须是它的页面view，已经显示在window之上了
    return self.controller.navigationController;
}

#pragma mark-------调用系统文件预览功能 E-------------


 
@end
